<template>
	<view
		v-if="inited"
		class="v-transition"
		ref="v-transition"
		@tap="clickHandler"
		:class="classes"
		:style="[mergeStyle]"
		@touchmove="noop"
	>
		<slot />
	</view>
</template>

<script>
import props from "./props.js";
import mpMixin from "../../libs/mixin/mpMixin.js";
import mixin from "../../libs/mixin/mixin.js";
// 组件的methods方法，由于内容较长，写在外部文件中通过mixin引入
import transition from "./transition.js";
/**
 * transition  动画组件
 * @description
 * @tutorial
 * @property {String}			show			是否展示组件 （默认 false ）
 * @property {String}			mode			使用的动画模式 （默认 'fade' ）
 * @property {String | Number}	duration		动画的执行时间，单位ms （默认 '300' ）
 * @property {String}			timingFunction	使用的动画过渡函数 （默认 'ease-out' ）
 * @property {Object}			customStyle		自定义样式
 * @event {Function} before-enter	进入前触发
 * @event {Function} enter			进入中触发
 * @event {Function} after-enter	进入后触发
 * @event {Function} before-leave	离开前触发
 * @event {Function} leave			离开中触发
 * @event {Function} after-leave	离开后触发
 * @example
 */
export default {
	name: "v-transition",
	data() {
		return {
			inited: false, // 是否显示/隐藏组件
			viewStyle: {}, // 组件内部的样式
			status: "", // 记录组件动画的状态
			transitionEnded: false, // 组件是否结束的标记
			display: false, // 组件是否展示
			classes: "", // 应用的类名
		};
	},
	emits: [
		"click",
		"beforeEnter",
		"enter",
		"afterEnter",
		"beforeLeave",
		"leave",
		"afterLeave",
	],
	computed: {
		mergeStyle() {
			const { viewStyle, customStyle } = this;
			return {
				// #ifndef APP-NVUE
				transitionDuration: `${this.duration}ms`,
				// display: `${this.display ? '' : 'none'}`,
				transitionTimingFunction: this.timingFunction,
				// #endif
				// 避免自定义样式影响到动画属性，所以写在viewStyle前面
				...uni.$u.addStyle(customStyle),
				...viewStyle,
			};
		},
	},
	// 将mixin挂在到组件中，uni.$u.mixin实际上为一个vue格式对象
	mixins: [mpMixin, mixin, transition, props],
	watch: {
		show: {
			handler(newVal) {
				// vue和nvue分别执行不同的方法
				// #ifdef APP-NVUE
				newVal ? this.nvueEnter() : this.nvueLeave();
				// #endif
				// #ifndef APP-NVUE
				newVal ? this.vueEnter() : this.vueLeave();
				// #endif
			},
			// 表示同时监听初始化时的props的show的意思
			immediate: true,
		},
	},
};
</script>

<style lang="scss" scoped>
@import "../../libs/css/components.scss";

/* #ifndef APP-NVUE */
// vue版本动画相关的样式抽离在外部文件
@import "./vue.ani-style.scss";
/* #endif */

.v-transition {
}
</style>
